package bdsimple.impl.mysql;

import java.util.ArrayList;
import java.util.Collection;
import java.util.List;

import bdsimple.abstractfactory.AbstractFactoryDAO;
import bdsimple.dao.base.ItemDAO;
import bdsimple.dao.base.ItemVampiroDAO;
import bdsimple.dao.base.ItemVentaDAO;
import bdsimple.dao.base.PrecioItemCiudadDAO;
import bdsimple.dao.base.TarjetaMemoriaDAO;
import bdsimple.dao.base.TarjetaMemoriaItemDAO;
import bdsimple.dto.base.ItemDTO;
import bdsimple.dto.base.ItemVampiroDTO;
import bdsimple.dto.base.ItemVentaDTO;
import bdsimple.dto.base.PrecioItemCiudadDTO;
import bdsimple.dto.base.TarjetaMemoriaDTO;
import bdsimple.dto.base.TarjetaMemoriaItemDTO;
import dao.base.impl.BaseDTO;
import dao.base.impl.Reference;

public class ItemDTOImpl extends BaseDTO implements ItemDTO {
	
	public ItemDTOImpl() {
		super(ItemDAO.class);
	}

	// --------------------------------------------------------------------------
	
	private String nombre;
	
	private String descripcion;
	
	private byte [] imagen ;
	
	private List<ItemVampiroDTO> itemVampiroDTOList;
	
	private Reference<TarjetaMemoriaDTO> tarjetaMemoriaDTORef = new Reference<TarjetaMemoriaDTO>();
	
	private List<TarjetaMemoriaItemDTO> tarjetaMemoriaItemDTOList;
	
	private List<ItemVentaDTO> itemVentaDTOList;
	
	private List<PrecioItemCiudadDTO> precioItemCiudadDTOList;

	// --------------------------------------------------------------------------
	
	public String getNombre() {
		return nombre;
	}

	public void setNombre(String nombre) {
		this.nombre = nombre;
	}
	
	// --------------------------------------------------------------------------

	public String getDescripcion(){
		return descripcion;
	}

	public void setDescripcion(String descripcion){
		this.descripcion = descripcion;
	}
	
	// --------------------------------------------------------------------------
	
	public void setImagen(byte [] imagen){
		this.imagen = imagen;
	}

	public byte [] getImagen(){
		return imagen;
	}
	
	// --------------------------------------------------------------------------
	
	@SuppressWarnings("unchecked")
	public List<ItemVampiroDTO> getItemVampiroDTOList() {
		if (itemVampiroDTOList == null) {
			try {
				// Lazy load the list
				ItemVampiroDAO itemVampiroDAO = (ItemVampiroDAO) AbstractFactoryDAO
						.getFactoryDAO(). //
						getDAO(ItemVampiroDAO.class, connectionBean);

				itemVampiroDTOList = new ArrayList<ItemVampiroDTO>();
				itemVampiroDTOList.addAll((Collection<? extends ItemVampiroDTO>) // 
						itemVampiroDAO.listBy(ItemVampiroDTOImpl.ITEM_REFERENCIA, id));

			} catch (Exception e) {
				throw new RuntimeException(e);
			}
		}

		return itemVampiroDTOList;
	}

	public void setItemVampiroDTOList(List<ItemVampiroDTO> itemVampiroDTOList) {
		throw new UnsupportedOperationException();
	}

	// --------------------------------------------------------------------------
	
	public Reference<TarjetaMemoriaDTO> getTarjetaMemoriaDTORef() {
		return tarjetaMemoriaDTORef;
	}
	
	public TarjetaMemoriaDTO getTarjetaMemoriaDTO() {
		if (tarjetaMemoriaDTORef.getRefValue() == null) {
			if (tarjetaMemoriaDTORef.getRefIdent() != 0) {
				try {
					
					TarjetaMemoriaDAO tarjetaMemoriaDAO = (TarjetaMemoriaDAO) AbstractFactoryDAO.getFactoryDAO(). //
						getDAO(TarjetaMemoriaDAO.class, connectionBean);

					tarjetaMemoriaDTORef.setRefValue( //
							(TarjetaMemoriaDTO) tarjetaMemoriaDAO.loadById(tarjetaMemoriaDTORef.getRefIdent()));

				} catch (Exception e) {
					e.printStackTrace();
					throw new RuntimeException(e);
				}
			}
		}

		return tarjetaMemoriaDTORef.getRefValue();
	}

	public void setTarjetaMemoriaDTO(TarjetaMemoriaDTO tarjetaMemoriaDTO) {
		this.tarjetaMemoriaDTORef.setRefValue(tarjetaMemoriaDTO);
	}
	
	// --------------------------------------------------------------------------

	@SuppressWarnings("unchecked")
	public List<TarjetaMemoriaItemDTO> getTarjetaMemoriaItemDTOList() {
		if (tarjetaMemoriaItemDTOList == null) {
			try {
				// Lazy load the list
				TarjetaMemoriaItemDAO tarjetaMemoriaItemDAO = //
					(TarjetaMemoriaItemDAO) AbstractFactoryDAO.getFactoryDAO(). //
						getDAO(TarjetaMemoriaItemDAO.class, connectionBean);

				tarjetaMemoriaItemDTOList = new ArrayList<TarjetaMemoriaItemDTO>();
				tarjetaMemoriaItemDTOList.addAll((Collection<? extends TarjetaMemoriaItemDTO>) // 
						tarjetaMemoriaItemDAO.listBy(TarjetaMemoriaItemDTO.ITEM_REFERENCE, id));

			} catch (Exception e) {
				throw new RuntimeException(e);
			}
		}

		return tarjetaMemoriaItemDTOList;
	}

	public void setTarjetaMemoriaItemDTOList(
			List<TarjetaMemoriaItemDTO> tarjetaMemoriaItemDTOList) {
		throw new UnsupportedOperationException();
	}

	// --------------------------------------------------------------------------
	
	@SuppressWarnings("unchecked")
	public List<ItemVentaDTO> getItemVentaDTOList() {
		if (itemVentaDTOList == null) {
			try {
				// Lazy load the list
				ItemVentaDAO itemVentaDAO = //
					(ItemVentaDAO) AbstractFactoryDAO.getFactoryDAO(). //
						getDAO(ItemVentaDAO.class, connectionBean);

				itemVentaDTOList = new ArrayList<ItemVentaDTO>();
				itemVentaDTOList.addAll((Collection<? extends ItemVentaDTO>) // 
						itemVentaDAO.listBy(ItemVentaDTO.ITEM_REFERENCE, id));

			} catch (Exception e) {
				throw new RuntimeException(e);
			}
		}

		return itemVentaDTOList;
	}

	public void setItemVentaDTOList(List<ItemVentaDTO> itemVentaDTOList) {
		throw new UnsupportedOperationException();
	}

	// --------------------------------------------------------------------------
	
	@SuppressWarnings("unchecked")
	public List<PrecioItemCiudadDTO> getPrecioItemCiudadDTOList() {
		if (precioItemCiudadDTOList == null) {
			try {
				// Lazy load the list
				PrecioItemCiudadDAO precioItemCiudadDAO = //
					(PrecioItemCiudadDAO) AbstractFactoryDAO.getFactoryDAO(). //
						getDAO(PrecioItemCiudadDAO.class, connectionBean);

				precioItemCiudadDTOList = new ArrayList<PrecioItemCiudadDTO>();
				precioItemCiudadDTOList.addAll((Collection<? extends PrecioItemCiudadDTO>) // 
						precioItemCiudadDAO.listBy(PrecioItemCiudadDTO.ITEM_REFERENCIA, id));

			} catch (Exception e) {
				throw new RuntimeException(e);
			}
		}

		return precioItemCiudadDTOList;
	}

	public void setPrecioItemCiudadDTOList(
			List<PrecioItemCiudadDTO> precioItemCiudadDTOList) {
		throw new UnsupportedOperationException();
	}

}
